// 数据库快速连接包
package dbgorm

import (
	"fmt"
	"strings"
	"sync"

	"gorm.io/gorm"
)

var (
	max_connect    = 0 // 最大连接数量，0-不限制
	default_config = OptionInfo{
		Conf: gorm.Config{},
	}
)

// 设置默认连接信息
//
//	cnf	默认连接信息
func SetDefault(cnf ...Option) {
	for i := 0; i < len(cnf); i++ {
		cnf[i](&default_config)
	}
}

// 设置缓存池中的最大连接数量
//
//	max	最大连接量
func SetMaxConnect(max int) {
	max_connect = max
}

var _cache_key_map sync.Map

// 获取缓存下标
//
//	def	连接配置项
func cache_key(def *OptionInfo) string {
	// 当前缓存长度计算
	if max_connect > 0 {
		i := 0
		_cache.Range(func(key, value any) bool {
			i++
			return true
		})
		// 如果缓存长度触碰到了最大连接数，则清空缓存重新进行存储计算
		if i >= max_connect {
			_cache.Range(func(key, value any) bool {
				temp := value.(*OptionInfo)
				if db, err := temp.DB.DB.DB(); err == nil {
					db.Close()
				}
				return true
			})
			_cache = sync.Map{}
		}
	}
	if v, ok := _cache_key_map.Load(def.Alias); ok {
		return v.(string)
	} else if v, ok := _cache_key_map.Load(def.DSN); ok {
		return v.(string)
	} else if v, ok := _cache_key_map.Load(fmt.Sprintf("%s:%s/%d", def.Type, def.DSN, def.LogLevel)); ok {
		return v.(string)
	}
	ck := fmt.Sprintf("%s:%s/%d", def.Type, def.DSN, def.LogLevel)
	_cache_key_map.Store(def.DSN, ck)
	if def.Alias != "" {
		_cache_key_map.Store(def.Alias, ck)
	}
	return ck
}

// 根据DSN智能获取数据库类型
//
//	dsn	数据库连接字符串
func getType(dsn string) string {
	if strings.Contains(dsn, ".db") || strings.Contains(dsn, ".db3") || strings.Contains(dsn, ".sqlite") || strings.Contains(dsn, ".sqlite3") {
		return "sqlite"
	} else if strings.Contains(dsn, " user=") || strings.Contains(dsn, "postgres://") {
		return "postgres"
	} else if strings.Contains(dsn, "sqlserver://") || strings.Contains(dsn, "user id=") {
		return "sqlserver"
	}
	return "mysql"
}
